/*!
 * 文件名称： gd32f30x_interrupt.c
 * 描    述： 中断文件
 * 版本：     2023-12-03, V1.0
*/

/*
* GD32F303东方红开发板V1.0
* 淘宝商城：   https://juwo.taobao.com
* 技术交流：   https://www.gd32bbs.com/ask/
* 视频学习：   https://space.bilibili.com/475462605
* 微信公众号： gd32bbs
* Copyright    苏州聚沃电子科技有限公司
* 版权所有，盗版必究。
*/


#include "driver_public.h"
#include "gd32f30x_interrupt.h"

void error_reset(void);

/*!
    \brief      this function handles NMI exception
    \param[in]  none
    \param[out] none
    \retval     none
*/
void NMI_Handler(void)
{
}

/*!
    \brief      this function handles HardFault exception
    \param[in]  none
    \param[out] none
    \retval     none
*/
void HardFault_Handler(void)
{
    /* if Hard Fault exception occurs, go to infinite loop */
    while (1){
        error_reset();        
    }
}
/*!
    \brief      this function handles MemManage exception
    \param[in]  none
    \param[out] none
    \retval     none
*/
void MemManage_Handler(void)
{
    /* if Memory Manage exception occurs, go to infinite loop */
    while (1){
        error_reset();        
    }
}
/*!
    \brief      this function handles BusFault exception
    \param[in]  none
    \param[out] none
    \retval     none
*/
void BusFault_Handler(void)
{
    /* if Bus Fault exception occurs, go to infinite loop */
    while (1){
        error_reset();        
    }
}
/*!
    \brief      this function handles UsageFault exception
    \param[in]  none
    \param[out] none
    \retval     none
*/
void UsageFault_Handler(void)
{
    /* if Usage Fault exception occurs, go to infinite loop */
    while (1){
        error_reset();        
    }
}

/*!
    \brief      this function handles SysTick exception
    \param[in]  none
    \param[out] none
    \retval     none
*/
void SysTick_Handler(void)
{
    driver_tic_inc();
}

/*!
* 说明       异常错误复位操作函数
* 输入[1]    无
* 返回值     无
*/
void error_reset(void)
{
    RCU_APB1EN|=RCU_APB1EN_PMUEN;    
    {   
        /* 关闭所有中断 */
        REG32(0xE000E010U) &= 0x00010004U;
        REG32(0xE000E180U)  = 0xFFFFFFFFU;
        REG32(0xE000E184U)  = 0xFFFFFFFFU;
        REG32(0xE000E188U)  = 0xFFFFFFFFU;                         
  
			  /* 打开看门狗 */
        rcu_osci_on(RCU_IRC40K);
        rcu_osci_stab_wait(RCU_IRC40K);
        fwdgt_config(20,FWDGT_PSC_DIV64);  
        fwdgt_enable();
        delay_us(100);//delay mini 100us
        
			  /* 进入standby模式，等待看门狗唤醒复位 */
        SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
        PMU_CTL |= PMU_CTL_STBMOD;
        PMU_CTL |= PMU_CTL_WURST;
        
        __WFI();
    }  
}

